<?php

namespace app\common\model;

use think\Model;

/**
 * 动态评论模型
 * 用于处理动态的评论功能，支持无限级评论结构
 * 数据表字段：
 * - id: 评论ID
 * - post_id: 所属动态ID
 * - user_id: 评论用户ID
 * - parent_id: 父评论ID，如果是一级评论则为0
 * - root_comment_id: 根评论ID，用于构建评论树结构
 * - content: 评论内容
 * - like_count: 评论点赞数
 * - author: 是否是动态作者的评论，1是，0否
 * - reply: 是否是回复，1是，0否
 * - created_at: 评论时间
 * - is_deleted: 是否删除，1是，0否
 */
class PostComment extends Model
{
    // 表名
    protected $name = 'post_comment';

    /**
     * 获取评论列表
     * 根据动态ID获取评论列表，支持分页
     * 如果parent_id为0，则获取一级评论，并附带每个一级评论的二级回复
     * 如果parent_id大于0，则获取指定父评论下的回复
     * 
     * @param int $post_id 动态ID
     * @param int $parent_id 父评论ID，默认为0获取顶级评论
     * @return \think\Paginator 分页后的评论列表
     */
    public static function getCommentList($post_id, $parent_id = 0)
    {
        // 查询评论列表，关联用户表获取用户信息
        $list = self::alias('c')
            ->field('c.id, c.post_id, c.user_id, c.parent_id, c.content, c.created_at, c.like_count, c.author, c.root_comment_id, c.reply, u.nickname, u.avatar')
            ->join('user u', 'u.id=c.user_id')
            ->where('c.post_id', $post_id)
            ->where('c.parent_id', $parent_id)
            ->where('c.is_deleted', 0)
            ->order('c.created_at', 'desc') // 按评论时间倒序排列
            ->paginate();
        
        // 如果是获取一级评论，则需要同时获取每个一级评论下的二级回复
        if ($parent_id == 0) {
            foreach ($list as &$comment) {
                // 获取每个顶级评论的回复（二级评论）
                // 这里使用root_comment_id字段查询，确保获取到的是当前一级评论下的所有回复
                $replies = self::alias('c')
                    ->field('c.id, c.post_id, c.user_id, c.parent_id, c.content, c.created_at, c.like_count, c.author, c.root_comment_id, c.reply, u.nickname, u.avatar')
                    ->join('user u', 'u.id=c.user_id')
                    ->where('c.root_comment_id', $comment['id'])
                    ->where('c.is_deleted', 0)
                    ->order('c.created_at', 'asc') // 回复按时间正序排列，最早的回复在前
                    ->select();
                // 将回复添加到评论数据中
                $comment['replies'] = $replies;
            }
        }
        
        return $list;
    }

    /**
     * 添加评论
     * 添加评论或回复，并自动更新动态的评论数
     * 
     * @param array $data 评论数据，包含以下字段：
     *                    - post_id: 动态ID
     *                    - user_id: 用户ID
     *                    - parent_id: 父评论ID，如果是一级评论则为0
     *                    - content: 评论内容
     *                    - author: 是否是动态作者的评论
     *                    - reply: 是否是回复
     *                    - root_comment_id: 根评论ID，用于构建评论树结构
     * @return PostComment 创建的评论对象
     */
    public static function addComment($data)
    {
        // 创建评论记录
        $comment = self::create($data);
        
        // 更新动态的评论数，使用setInc方法自增评论数
        Post::where('id', $data['post_id'])->setInc('comment_count');
        
        return $comment;
    }
}